
	
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.*;
import java.awt.*;
import javax.swing.*;

import java.awt.event.*;
import javax.swing.event.*;



public class Cube implements GLEventListener, ActionListener, ChangeListener {
	
	public static void main(String[] args) {
		new Cube();
	}
	
	private int INTITIAL_WIDTH=1000;
	private int INITIAL_HEIGHT=1000;
	
	JButton quitButton;
	private GLCanvas canvas;
	private GL2 gl;
	private GLU glu;
	private float X = 10f;
	private float Y  = 2f;
	private float Z = 6f;
	private JSlider xSlider, ySlider, zSlider;
	
	float vertices[][] = new float [][] {
			{-1,-1,-1}, {-1, -1, 1}, {-1, 1, -1}, {-1, 1, 1}, {1, -1, -1},
			{1, -1,1}, {1, 1, -1}, {1, 1,1} 
	};
	
	float colors[][] = new float[][] {	

			{1f,0f,0f}, {0f, 1f, 0f}, {0f, 0f, 1f}, {0f, 1f, 1f}, {1f, 0f, 1f}, {1f, 1f,0f}
	};
	
	public  Cube() {
			GLProfile glp=GLProfile.getDefault();
			GLCapabilities caps = new GLCapabilities(glp);
			canvas = new GLCanvas(caps);
			JFrame frame = new JFrame("CUBE");

			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
			frame.setSize(800, 800);
			frame.setLayout(new BorderLayout());
			JPanel north = new JPanel( new BorderLayout());
			JPanel topRow = new JPanel( new GridLayout(1, 8));
			
			quitButton = new JButton( "Quit");
			quitButton.addActionListener(this);
			topRow.add(quitButton);
			for (int i= 0; i < 7; i++)
				topRow.add(new JLabel( " ")); 
			
			north.add(topRow, BorderLayout.NORTH);
			
			JPanel south = new JPanel(new GridLayout(3, 1));
			JPanel secondRow = new JPanel(new BorderLayout());
			JPanel thirdRow = new JPanel( new BorderLayout());
			JPanel fourthRow = new JPanel( new BorderLayout() );
			xSlider = new JSlider(-50, 50);
			xSlider.setValue((int)(X));
			xSlider.setMajorTickSpacing(10);
			xSlider.setPaintTicks(true);
			xSlider.setPaintLabels(true);
			xSlider.addChangeListener(this);
			JLabel xSliderName = new JLabel("   X");
			secondRow.add(xSliderName, BorderLayout.WEST);
			secondRow.add(xSlider, BorderLayout.CENTER);
			south.add(secondRow);
			ySlider = new JSlider(-50, 50);
			ySlider.setValue((int)(Y));
			ySlider.setMajorTickSpacing(10);
			ySlider.setPaintTicks(true);
			ySlider.setPaintLabels(true);
			ySlider.addChangeListener(this);
			JLabel ySliderName = new JLabel("   Y");
			thirdRow.add(ySliderName, BorderLayout.WEST);
			thirdRow.add(ySlider, BorderLayout.CENTER);
			south.add(thirdRow);
			zSlider = new JSlider(-50, 50);
			zSlider.setValue((int)(Z));
			zSlider.setMajorTickSpacing(10);
			zSlider.setPaintTicks(true);
			zSlider.setPaintLabels(true);
			zSlider.addChangeListener(this);
			JLabel zSliderName = new JLabel("   Z");
			fourthRow.add(zSliderName, BorderLayout.WEST);
			fourthRow.add(zSlider, BorderLayout.CENTER);
			south.add(fourthRow);
		
			north.add(south, BorderLayout.SOUTH);
			frame.add(north, BorderLayout.NORTH);
			JPanel myCanvas = new JPanel(new GridLayout(1,1));
			
			myCanvas.add(canvas);

			frame.add(myCanvas, BorderLayout.CENTER);
			
			frame.setVisible(true);
			canvas.addGLEventListener(this);

			FPSAnimator animator = new FPSAnimator(canvas, 60);
			animator.start(); 
				

	}
	public void actionPerformed(ActionEvent event) {
			if (event.getSource() == quitButton)
				System.exit(0);

	}
	
	public void stateChanged(ChangeEvent e) {
		if (e.getSource() == xSlider) {
			X = xSlider.getValue();
		}
		else if (e.getSource() == ySlider) {
			Y = ySlider.getValue();
		}
		else if (e.getSource() == zSlider) {
			Z = zSlider.getValue();
		}

	}


	public void display(GLAutoDrawable drawable) {
		update();
		render(drawable);
	}

	private void update() {			
		gl.glMatrixMode(GL2.GL_MODELVIEW);
		gl.glLoadIdentity();
		glu.gluLookAt(X, Y, Z, 0f, 0f, 0f, 0f, 0f, 1f);  
	}

	
	private void render(GLAutoDrawable drawable) {

		gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

		polygon(0,4,6,7,5);
		polygon(1,6,2,3,7);
		polygon(2,5,7,3,1);
		polygon(3,1,3,2,0);
		polygon(4,0,4,5,1);
		polygon(5,4,0,2,6); 

	}
	

	private void polygon(int colorIndex, int a, int b, int c, int d) {
		gl.glBegin(GL2.GL_POLYGON);
			gl.glColor3fv(colors[colorIndex], 0);
			gl.glVertex3fv(vertices[a], 0);
			gl.glVertex3fv(vertices[b], 0);
			gl.glVertex3fv(vertices[c], 0);
			gl.glVertex3fv(vertices[d], 0);
		gl.glEnd();
			
	}
	
	public void dispose(GLAutoDrawable drawable) {
		// put the cleanup code here
		
	}

	public void init(GLAutoDrawable drawable) {
		gl = drawable.getGL().getGL2();
		glu = new GLU();
		gl.glEnable(GL2.GL_DEPTH_TEST);
		gl.glMatrixMode(GL2.GL_PROJECTION);
		gl.glLoadIdentity();
		glu.gluPerspective(60f, 1f, 0.5f, 200f); 
		gl.glMatrixMode(GL2.GL_MODELVIEW);
		gl.glLoadIdentity();
		glu.gluLookAt(X, Y, Z, 0f, 0f, 0f, 0f, 0f, 1f);
		gl.glClearColor(1,  1, 1, 1);
		gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
	}

	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
		// this is called when the window is resized
		gl.glViewport(0, 0, width, height);
		float aspect = width*1.0f/height;
		gl.glMatrixMode(GL2.GL_PROJECTION);
		gl.glLoadIdentity();
		glu.gluPerspective(60f, aspect, 0.5f, 200f); 
		gl.glMatrixMode(GL2.GL_MODELVIEW);
		
		
	}
	
}
